{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "<a target=\"_blank\" href=\"https://colab.research.google.com/github/cohere-ai/notebooks/blob/main/notebooks/What_Is_Similarity_Between_Sentences.ipynb\">\n",
        "  <img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/>\n",
        "</a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "psRggLwvhi1E"
      },
      "source": [
        "In this notebook, we understand the intuition behind similarities between sentences, including dot product and cosine similarity.\n",
        "\n",
        "Read the accompanying [blog post here](https://txt.cohere.ai/what-is-similarity-between-sentences/)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-H_N7AkCV0P-"
      },
      "outputs": [],
      "source": [
        "# TODO: upgrade to \"cohere>5\"\n",
        "! pip install \"cohere<5\" altair > /dev/null"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Zg5H7gd7V0Mu"
      },
      "outputs": [],
      "source": [
        "import cohere\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import seaborn as sns\n",
        "import altair as alt\n",
        "\n",
        "api_key = '' # Paste your API key here. Remember to not share it publicly \n",
        "co = cohere.Client(api_key)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4_YQVuAbf3Xh"
      },
      "source": [
        "## Turn text into embeddings"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6HujlbFsIZjW"
      },
      "outputs": [],
      "source": [
        "sentence1 = np.array(co.embed([\"I like to be in my house\"]).embeddings)\n",
        "sentence2 = np.array(co.embed([\"I enjoy staying home\"]).embeddings)\n",
        "sentence3 = np.array(co.embed([\"the isotope 238u decays to 206pb\"]).embeddings)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "QIZoRxXVNPQY",
        "outputId": "9b73065b-098e-44e3-c21d-e30b3a0f9fe2"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Embedding for sentence 1 [[-1.3662109  -0.53759766  0.06109619 ...  0.60839844 -0.2902832\n",
            "   0.68408203]]\n",
            "Embedding for sentence 2 [[-0.38427734  2.3808594   2.5527344  ...  0.12353516 -0.91259766\n",
            "   0.6542969 ]]\n",
            "Embedding for sentence 3 [[-1.1621094  -1.9238281  -1.1611328  ... -2.9785156   1.5751953\n",
            "   0.15478516]]\n"
          ]
        }
      ],
      "source": [
        "print(\"Embedding for sentence 1\", sentence1)\n",
        "print(\"Embedding for sentence 2\", sentence2)\n",
        "print(\"Embedding for sentence 3\", sentence3)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "9pR9yDy1ot17"
      },
      "source": [
        "## Calculate dot products"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "8b-FViGlJQLe",
        "outputId": "9eec0fc0-2f2c-43c6-c4ac-389e9ea671ee"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Similarity between sentences 1 and 2: 6738.2858668486715\n",
            "Similarity between sentences 1 and 3: -122.22666955510499\n",
            "Similarity between sentences 2 and 3: -3.494608113647928\n"
          ]
        }
      ],
      "source": [
        "from numpy import dot\n",
        "print(\"Similarity between sentences 1 and 2:\", dot(sentence1[0], sentence2[0]))\n",
        "print(\"Similarity between sentences 1 and 3:\", dot(sentence1[0], sentence3[0]))\n",
        "print(\"Similarity between sentences 2 and 3:\", dot(sentence2[0], sentence3[0]))"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "sb-MX-MdhlPj",
        "outputId": "4437d83b-7857-4dc3-d6cc-06d32b91aeb2"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Similarity between sentences 1 and 1: 8709.117812702145\n",
            "Similarity between sentences 2 and 2: 8703.38120899619\n",
            "Similarity between sentences 3 and 3: 7978.303206108623\n"
          ]
        }
      ],
      "source": [
        "print(\"Similarity between sentences 1 and 1:\", np.dot(sentence1[0], sentence1[0]))\n",
        "print(\"Similarity between sentences 2 and 2:\", np.dot(sentence2[0], sentence2[0]))\n",
        "print(\"Similarity between sentences 3 and 3:\", np.dot(sentence3[0], sentence3[0]))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DWEpWsI0o8gn"
      },
      "source": [
        "## Calculate cosine similarities"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "D4ZkpwMSL_oH",
        "outputId": "08252157-d689-45af-9210-0802d2a073ed"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Cosine similarity between sentences 1 and 2: 0.7739596968978093\n",
            "Cosine similarity between sentences 1 and 3: -0.014663026750986932\n",
            "Cosine similarity between sentences 2 and 3: -0.00041937178612739233\n"
          ]
        }
      ],
      "source": [
        "from sklearn.metrics.pairwise import cosine_similarity\n",
        "print(\"Cosine similarity between sentences 1 and 2:\", cosine_similarity(sentence1, sentence2)[0][0])\n",
        "print(\"Cosine similarity between sentences 1 and 3:\", cosine_similarity(sentence1, sentence3)[0][0])\n",
        "print(\"Cosine similarity between sentences 2 and 3:\", cosine_similarity(sentence2, sentence3)[0][0])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "tZ7ls1JlkngY",
        "outputId": "8d28b53b-08f0-44dd-9498-671d1d35f27f"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Cosine similarity between sentences 1 and 1: 1.0000000000000009\n",
            "Cosine similarity between sentences 2 and 2: 1.0000000000000016\n",
            "Cosine similarity between sentences 3 and 3: 0.9999999999999996\n"
          ]
        }
      ],
      "source": [
        "from sklearn.metrics.pairwise import cosine_similarity\n",
        "print(\"Cosine similarity between sentences 1 and 1:\", cosine_similarity(sentence1, sentence1)[0][0])\n",
        "print(\"Cosine similarity between sentences 2 and 2:\", cosine_similarity(sentence2, sentence2)[0][0])\n",
        "print(\"Cosine similarity between sentences 3 and 3:\", cosine_similarity(sentence3, sentence3)[0][0])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 457
        },
        "id": "sO3AxCUJq7AH",
        "outputId": "7118f5f8-7a78-4607-e31f-e08f4b23e5e3"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[Text(0.5, 0, 'I like to be in my house'),\n",
              " Text(1.5, 0, 'I enjoy staying home'),\n",
              " Text(2.5, 0, 'the isotope 238u decays to 206pb')]"
            ]
          },
          "execution_count": 32,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhcAAAGCCAYAAABTmuElAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeViU5fv38fcwgKKI4QLilmuumZVmmqW5BCoKaKlRalpafnNPUywFrHApyxTNXFITK3PJLbdc0krUNFMLV9wTIcFEVARm5vnDh/lJKIIOzaCf13HMccA9133NyQ0655zXchssFosFERERERtxsncAIiIicm9RciEiIiI2peRCREREbErJhYiIiNiUkgsRERGxKSUXIiIiYlNKLkRERO5D48ePp0WLFtSoUYPDhw/ftI3JZCI8PJxWrVrRunVrFi1alKu+lVyIiIjch1q2bMmCBQsoV67cLdusXLmSU6dOsX79ehYuXMiUKVM4c+bMbftWciEiInIfatCgAT4+Pjm2Wb16NS+88AJOTk6UKFGCVq1asXbt2tv27WyrIEVERMS+kpOTSU5Oznbcw8MDDw+PPPcXFxdH2bJlrd/7+Phw7ty5256n5ELkDoSHh9s7BBEpIEJDQ+/q/PTzx3Lddt7X3xMZGZnteL9+/ejfv/9dxZEXSi5E7tDIN7vZO4R7VsTU+QAMKxFv50juXR8meQPw3gcz7BzJvW3UO33uvhOzKddNe/ToQVBQULbjd1K1gOuVirNnz1KvXj0geyXjVpRciIiIODKLOddN73T441b8/PxYtGgRzz33HP/88w8bNmxgwYIFtz1PEzpFREQcmdmc+0cevP/++zzzzDOcO3eOnj170q5dOwB69+7N/v37AQgICKB8+fI899xzdO7cmTfffJMKFSrctm9VLkRERByYJQ+Vi7x49913effdd7MdnzlzpvVro9F4R3PMlFyIiIg4sjxWJByBkgsRERFHlk+Vi/yk5EJERMSRmdLtHUGeKbkQERFxZBoWEREREVvKrwmd+UnJhYiIiCNT5UJERERsSpULERERsSlN6BQRERGb0rCIiIiI2JSGRURERMSmVLkQERERW7JYcn/LdUeh5EJERMSRaVhEREREbMqUYe8I8kzJhYiIiCMza1hEREREbEnDIiIiImJTWi0iIiIiNqXK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53fLc5RciIiIOLI8bOvdo0cPgoKCsh3/d9UCwMfHh/j4eEwmE0ajEZPJREJCAj4+PlnaRUVFERERgZOTE8WKFaNFixbs2LFDyYWIiEhBZckw5brtzYY/bqVkyZLUqlWLVatWERAQwKpVq6hVq1a2vYjKly/P1q1bqVevHmlpaURHR9O6desc+9aEThEREUeWjzcuCwsLIyoqCl9fX6KioggPv75PRu/eva07H48cOZLdu3fTvn17AgMDqVSpEp07d86xX1UuREREHJk5//a6rFq1KosWLcp2fObMmdavK1asyJw5c/LUr5ILERERR+ZA9wzJLSUXIiIijkzJhYiIiNhUAbwFmJILERERR5aH1SKOQsmFiIiII7uDVSD2puRCRETEkeXjapH8ouRCRETEgVk0oVNERERsSpULERERsSmTJnSKiIiILWlYRERERGxKwyIiIiJiU1qKKiIiIjalyoWIiIjYkpaiioiIiG1lKLkQERERW9KcCxEREbEpzbkQERERW7IouRARERGbUnIhIiIiNqXVIiIiImJTWi0iIiIitmSxaFhEREREbElzLkTuHxFT59s7hHveh0ne9g7hnjfqnT72DkFuR8mFiIiI2JKWoorcR4aViLd3CPeszIrFyDe72TmSe1dm5e29D2bYOZJ7m00qQxlKLkRERMSGVLkQERER21JyISIiIjZV8La5UHIhIiLiyDQsIiIiIralyoWIiIjYkkWrRURERMSWLKpciIiIiE0puRARERFbys/KxfHjxxkxYgT//PMPDzzwAOPHj6dSpUrZ2q1evZrPPvsMi8WCwWBgzpw5lCpV6pb9KrkQERFxZPmYXISGhhIcHExAQADLly9n9OjRfPnll1na7N+/n8jISObNm0fp0qW5dOkSrq6uOfbrlH8hi4iIyN0yZ+T+kReJiYnExMTg7+8PgL+/PzExMSQlJWVpN3fuXHr16kXp0qUBKFasGIUKFcqxb1UuREREHFhehkWSk5NJTk7OdtzDwwMPD48sx+Li4vD29sZoNAJgNBrx8vIiLi6OEiVKWNvFxsZSvnx5XnrpJa5cuULr1q3p27cvBoPhlnEouRAREXFkllu/if/bvHnziIyMzHa8X79+9O/f/45e3mQycejQIebMmUNaWhqvvfYaZcuWJTAw8JbnKLkQERFxYHmpXPTo0YOgoKBsx/9dtQDw8fEhPj4ek8mE0WjEZDKRkJCAj49PlnZly5bFz88PV1dXXF1dadmyJfv27csxudCcCxEREQdmMRty/fDw8KB8+fLZHjdLLkqWLEmtWrVYtWoVAKtWraJWrVpZhkTg+lyMn3/+GYvFQnp6Otu3b6dmzZo5xqzkQkRExIFZzLl/5FVYWBhRUVH4+voSFRVFeHg4AL1792b//v0AtGvXjpIlS9K2bVsCAwOpVq0azz//fI79alhERETEgZlNuZ9zkVdVq1Zl0aJF2Y7PnDnT+rWTkxMhISGEhITkul8lFyIiIg7MYs6/5CK/KLkQERFxYJaCd98yJRciIiKOTJULERERsSklFyIiImJTGhYRERERmzKbCt6uEUouREREHFh+3nI9vyi5EBERcWDmPNxbxFEouRAREXFgFiUXIiIiYktaLSIiIiI2lZ/bf+cXJRciIiIOrCDOuSh461scUIsWLTh8+LDN+tu4cSPjx4+3WX+3snTpUo4fP35XfcTHx9OtWzcbRXTdlClT/pOfX0SkILBYDLl+OApVLhxQy5YtadmyZb6/znfffYenpyeVK1e+4z68vb2ZP3++DaMSEZEbFcRNtFS5yGffffcdL7zwAh07dqR79+4cO3YMuF416NWrF4MGDaJdu3Z07dqVv//+2/rcgAEDrH3MmDEDf39//P39CQkJ4fLly1y7do2mTZuSkJBgbff+++8zffr0bDFs2LCB9u3bExAQgL+/Pzt27GDJkiX88ccfvP/++wQEBLBt2zYOHTpEcHAwQUFBtG3blrlz5wLXqxNNmzbl2rVr1j7feOMNVq5cyZkzZ2jUqJH1eI0aNZg+fTqdOnWiZcuWrFu3zvrcunXr8PPzIzAwkOnTp1OjRg0uX7580+sWHx9P79698fPzo0+fPly9ehWAy5cvExISYr0eN94WuFu3bowbN47g4GCaNWvG7NmzWbVqFV27dqVFixasWbPG2nbv3r1069aNjh070rFjR3788cfb/i5FROzBbDHk+uEolFzko127drFmzRoWLFjA0qVLefXVVxk5cqT1+f379zN8+HC+//57qlWrRlRUVLY+tmzZwooVK/jmm29YuXIlJpOJadOmUahQIQIDA/n222+B62+633//PS+88EK2PiZPnsyYMWNYvnw5y5cvp06dOnTq1Im6devy7rvvsnz5cpo0aUK5cuWYO3cu3333HYsWLeLbb78lNjYWb29vGjZsyOrVqwE4c+YMf/zxB76+vjf9ud3d3VmyZAkTJkzg/fffB+D8+fOMHj2a6dOns2zZMgoXLpzjtfvjjz+YOHEia9asISMjg5UrVwIwbdo0zGYzK1eu5JtvvmHZsmVs2bLFet65c+eIiori22+/ZfLkyRw5coRvvvmGSZMmMXbsWACSk5MJDQ1l4sSJLF26lOnTpzN69GiSk5NzjElExB4K4rCIkot8tGnTJg4ePMgLL7xAQEAAEydO5Ny5c9bnH3vsMXx8fAB45JFHOHXqVLY+oqOjadu2Le7u7hgMBjp37kx0dDQAL730EkuXLiUjI4MVK1bw1FNPUbJkyWx9PPnkk4wdO5ZZs2YRGxuLu7v7TeNNTU1l5MiRtG/fnhdffJGEhAQOHjwIXK8KfPXVVwB88803dOrUCVdX15v207ZtWwDq169PQkIC165dY+/evdSuXZtKlSoB0KlTpxyvXdOmTfHw8MBgMFCvXj3rtYmOjuaFF17AYDDg7u5Ou3btrNcDwM/PDycnJ7y9vXnggQdo1aoVAHXq1CE+Pp5r166xZ88ezpw5Q+/evQkICKB3794YDAZOnjyZY0wiIvZgMhty/XAUmnORjywWC506dWLgwIE3fb5QoULWr41GIyaTKU/9+/j4ULduXTZu3MhXX33FmDFjbtpu5MiRHDp0iO3btzNw4EB69uxJ586ds7X7+OOPKV26NOPGjcPZ2ZlevXpZh0Iee+wxTCYTu3fv5rvvvmPx4sW3jCvz5zIajQBkZGTk6ee6sY/Mfm4cksnLeTeLxWKxUKNGDRYsWJDnuERE/muOVJHILVUu8lGLFi1Yvny5tVphMpn4448/8tRH48aNWbNmDSkpKVgsFhYvXkyTJk2sz7/88stERETg7OzMo48+etM+jh07Ro0aNejRowcdOnRg//79ABQtWpRLly5Z2126dIkyZcrg7OzM4cOH2bVrV5Z+unXrxpAhQ3j00UetFZfceuSRR4iJibFWIL777rs8nZ+pcePGLFmyBIvFQkpKCqtXr85yPXLj0Ucf5eTJk2zfvt16bN++fVgK4qwpEbnnFcQ5F6pc5KOGDRsyaNAg+vbti8lkIj09HT8/P+rWrZvrPpo1a8ahQ4fo2rUrAHXr1qVv377W55944gkKFSpEcHDwLfuYOHEiJ0+exGg04uHhwQcffABAly5dGDduHLNnz2b48OH07duXt99+m8WLF1O5cmUaNmyYpZ927doxZsyYHF/rVkqVKkVYWBi9e/fGzc2N5s2b4+LigpubW576+d///sd7771H+/btAejQoQPPPPNMnvooXrw406ZN48MPPyQiIoL09HQqVKjA9OnTMRgc5x+niAhAQfzYY7Do45rDmTlzJqdPn77lMMeNTp8+zYsvvsgPP/yQ5zfqvNq1axdhYWGsXLnyjt6EU1JSrPM9lixZwuLFi/n6669tHeZ/Ijw8nGEl4u0dxj3rwyRvAEa+ads9VOT/REy9voT8vQ9m2DmSe9uod/oQGhp6V31s88l5jtqNmsQtuavXshVVLhzMp59+yrp165g4cWKu2i5ZsoQRI0bke2IxcuRItm3bxvjx4+/40/38+fNZu3YtJpOJ4sWLW1eSiIjIrRXEORdKLhzMwIEDbzkB9G7a3q2IiIi77qNv375ZhnREROT2TCi5EBERERsyF8DJC0ouREREHJhZlQsRERGxJYuSCxEREbEls70DuANKLkRERByYJnSKiIiITalyISIiIjalORciIiJiUw50s9NcU3IhIiLiwLQUVURERGyqAO6hpeRCRETEkWUUwLs1K7kQERFxYAWxcuFk7wBERETk1sx5eOTV8ePH6dKlC76+vnTp0oUTJ07csu2xY8d45JFHGD9+/G37VXIhIiLiwMyG3D/yKjQ0lODgYNatW0dwcDCjR4++aTuTyURoaCitWrXKVb9KLkRERByYGUOuH3mRmJhITEwM/v7+APj7+xMTE0NSUlK2tjNmzKB58+ZUqlQpV30ruRAREXFgljw8kpOTOXPmTLZHcnJytn7j4uLw9vbGaDQCYDQa8fLyIi4uLku7gwcP8vPPP/PKK6/kOmZN6BQREXFgGXkoSMybN4/IyMhsx/v160f//v3z/Nrp6emMGjWKsWPHWpOQ3FByISIi4sDyslqkR48eBAUFZTvu4eGR7ZiPjw/x8fGYTCaMRiMmk4mEhAR8fHysbf7++29OnTpFnz59gOuVEYvFQkpKCu+9994t41ByISIi4sDyMlHTw8PjponEzZQsWZJatWqxatUqAgICWLVqFbVq1aJEiRLWNmXLlmXHjh3W76dMmcKVK1cYPnx4jn1rzoWIiIgDy8+lqGFhYURFReHr60tUVBTh4eEA9O7d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",
            "text/plain": [
              "<Figure size 432x288 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "embeddings = [sentence1, sentence2, sentence3]\n",
        "dot_product_similarities = [[cosine_similarity(embeddings[i], embeddings[j])[0][0] for i in range(len(embeddings))] for j in range(len(embeddings))]\n",
        "ax = sns.heatmap(dot_product_similarities, vmin=0, vmax=1,\n",
        "                 linewidths=1, linecolor='grey',\n",
        "                 xticklabels=[\"I like to be in my house\", \"I enjoy staying home\", \"the isotope 238u decays to 206pb\"],\n",
        "                 yticklabels=[\"I like to be in my house\", \"I enjoy staying home\", \"the isotope 238u decays to 206pb\"],\n",
        ")\n",
        "ax.set_xticklabels(ax.get_xticklabels(), rotation=45)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4p2TSx4VrDj0"
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "colab": {
      "provenance": []
    },
    "gpuClass": "standard",
    "kernelspec": {
      "display_name": "Python 3.10.0 64-bit ('3.10.0')",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.10.0"
    },
    "vscode": {
      "interpreter": {
        "hash": "1fb8019e3560b882083e525615cf48e713d3a7345a15eb723d805e91aa410aac"
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
